home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / language / modula.zoo / _defn_windowba.def < prev    next >
Text File  |  1988-04-26  |  13KB  |  329 lines

  1. DEFINITION MODULE WindowBase;           (* Hans Endl  25. 09. 1986 *)
  2.                                         (*            02. 06. 1987 *)
  3.                                         (*            01. 10. 1987 *)
  4.  
  5. FROM SYSTEM     IMPORT ADDRESS;
  6. FROM GEMVDIbase IMPORT PxyArrayType;
  7.  
  8.  
  9. (*   Dieses Modul stellt eine Zwischenschicht zur Fensterprogrammierung
  10.      zur Verfügung, die etwas komfortablere Funktionen als die reinen
  11.      AES-Aufrufe enthält, aber nicht so sehr einschränkt wie die auf
  12.      MEDOS basierenden Moduln "Windows", "TextWindows" und "Graphic-
  13.      "Windows".
  14.  
  15.      Wichtige Bestandteile von "WindowBase" sind
  16.  
  17.      - die Struktur "windowtype", die die unter AES am häufigsten
  18.        benötigten Fensterdaten enthält
  19.  
  20.      - Prozeduren zum Setzen der Schieber
  21.  
  22.      - die automatische Abarbeitung der Rechteckliste bei Redraw-
  23.        Aufrufen
  24. *)
  25.  
  26.  
  27.  
  28. CONST
  29.   maxwindow  = 12;       (* 7 Fenster in GEM-AES möglich + 5 für Debugger *)
  30.   deskhandle = 0;
  31.  
  32. TYPE
  33.  
  34.   window         = INTEGER;
  35.  
  36.   (* Aus Gründen der Kompatibilität zu AES und MEDOS wird zur Iden-
  37.      tifikation eines Fensters nicht ein Zeiger auf den unten defi-
  38.      nierten Window-Record benutzt, sondern eine Integer-Zahl, die
  39.      mit dem AES-Window-Handle identisch ist und als Index eines
  40.      Feldes von Window-Records fungiert.
  41.   *)
  42.  
  43.  
  44.   rectangle      = RECORD
  45.                      x: INTEGER;  (* x-Koordinate der linken oberen Ecke *)
  46.                      y: INTEGER;  (* y-Koordinate der linken oberen Ecke *)
  47.                      w: INTEGER;  (* Breite *)
  48.                      h: INTEGER   (* Höhe   *)
  49.                    END;
  50.  
  51.   (* Definition eines Rechtecks in AES-spezifischer Form mit linker
  52.      oberer Ecke und Breite und Höhe in Pixeln, im Gegensatz zu der
  53.      vom VDI meist benutzten Form des PxyArrays, das durch zwei dia-
  54.      gonal gegenüberliegende Ecken definiert wird.
  55.   *)
  56.  
  57.   RedrawProcType = PROCEDURE (window, rectangle);
  58.  
  59.   WindowElement  = (Title, CloseButton, FullButton, Moveable,
  60.                     InfoLine, SizeButton, UpArrow, DownArrow,
  61.                     VertSlider, LeftArrow, RightArrow, HorizSlider);
  62.  
  63.   WindowElements = SET OF WindowElement;
  64.  
  65.  
  66. CONST
  67.   AllElements = WindowElements {Title..HorizSlider};
  68.   NoElements  = WindowElements{};
  69.  
  70.  
  71. TYPE
  72.  
  73.   wstring     = ARRAY [0..79] OF CHAR;  (* String für Titel und Info *)
  74.  
  75.   windowtype  = RECORD
  76.                   handle:     INTEGER;        (* AES-Fensternummer        *)
  77.                   max:        rectangle;      (* Maximale Fenstergröße    *)
  78.                   total:      rectangle;      (* Aussenmasse des Fensters *)
  79.                   work:       rectangle;      (* Innenmasse des Fensters  *)
  80.                   elements:   WindowElements; (* Menge der Fensterelemente*)
  81.                   fulled:     BOOLEAN;        (* Fenster auf max gesetzt  *)
  82.                   opened:     BOOLEAN;        (* Fenster geöffnet         *)
  83.                   ontop:      BOOLEAN;        (* TRUE, falls oberstes F.  *)
  84.                   text:       BOOLEAN;        (* TRUE, falls Textfenster  *)
  85.                   row, col:   INTEGER;        (* Zeile und Spalte bei Text*)
  86.                   maxrow:     INTEGER;        (* letzte sichtbare Zeile   *)
  87.                   maxcol:     INTEGER;        (* letzte sichtbare Spalte  *)
  88.                   colour:     INTEGER;        (* Hintergrundfarbe         *)
  89.                   style:      INTEGER;        (* Fülltyp für Hintergrund  *)
  90.                   textcolour: INTEGER;        (* Farbe des Textes         *)
  91.                   redrawproc: RedrawProcType; (* Redraw-Procedure         *)
  92.                   title:      wstring;        (* Titelzeile               *)
  93.                   info:       wstring;        (* Informationszeile        *)
  94.                   reference:  ADDRESS;        (* frei für Anwender        *)
  95.                 END;
  96.  
  97.   windowptr   = POINTER TO windowtype;
  98.  
  99.  
  100.  
  101. VAR
  102.   windowlist: ARRAY [0..maxwindow] OF windowtype;
  103.   handlelist: ARRAY [0..7] OF window;
  104.  
  105.   growbox:    BOOLEAN;    (* Wenn diese Variable auf TRUE gesetzt ist,
  106.                              wachsen bzw. schrumpfen die Fenster beim
  107.                              Öffnen bzw. Schliessen, default = TRUE *)
  108.  
  109.  
  110.  
  111.  
  112.   PROCEDURE createWindow (VAR u:      window;
  113.                           x, y, w, h: INTEGER;
  114.                           parts:      WindowElements;
  115.                           title:      ARRAY OF CHAR;
  116.                           textwindow: BOOLEAN;
  117.                           rdp:        RedrawProcType);
  118.  
  119.   (* Erzeugt die im AES und in diesem Modul notwendigen Datenstrukturen
  120.      zur Verwaltung eines Fensters, das jedoch noch nicht gezeichnet
  121.      wird.
  122.  
  123.      x, y, w und h beschreiben die maximale Grösse des äusseren Fenster-
  124.      randes. Sind w und h gleich 0, so wird die Grösse des Desktops
  125.      ohne Menüleiste übernommen.
  126.  
  127.      "parts" ist ein Set aus den gewünschten Fensterelementen.
  128.  
  129.      "title" ist der Fenstertitel.
  130.  
  131.      "textwindow" soll bei Textfenstern auf TRUE gesetzt werden,
  132.      der Fensterursprung wird dann an das Textraster angepaßt.
  133.  
  134.      "rdp" ist die Redraw-Prozedur, also die Prozedur, die den Inhalt
  135.      des Fensters zeichnet. Sie wird beim Aufruf der Prozedur "DoRedraw"
  136.      (siehe unten) so oft aufgerufen wird, bis die Rechteckliste, die
  137.      die sichtbaren Teile des Fensters angibt, abgearbeitet worden ist.
  138.      An "rdp" wird beim Aufruf ein Rechteck übergeben, das die neu
  139.      zu zeichnende Fläche angibt. Wurde beim Aufruf von "DoRedraw"
  140.      der Paramter "clip" auf FALSE gesetzt, muss "rdp" alle Ausgaben
  141.      selbst auf diese Fläche begrenzen, was die Ausgabe vor allem bei
  142.      Text stark beschleunigen kann, aber bei teilweise verdeckten Fen-
  143.      stern kaum durchführbar ist. Beim Zeichnen von Objektbäumen wird
  144.      das Begrenzungsrechteck direkt beim "ObjectDraw"-Aufruf angegeben.
  145.   *)
  146.  
  147.   PROCEDURE activate     (u: window);
  148.  
  149.   (* aktiviert ein deaktiviertes Fenster wieder *)
  150.  
  151.   PROCEDURE deactivate   (u: window);
  152.  
  153.   (* Deaktiviert ein Fenster, indem ein AES.WindowDelete durchgeführt
  154.      wird. Das Fenster existiert dann für GEM-AES nicht mehr, der Fen-
  155.      sterdeskriptor wird jedoch nicht freigegeben, so daß das Fenster
  156.      später mit "activate" mit den alten Parametern wieder aktiviert
  157.      werden kann. Dadurch können mehr als die sieben von GEM-AES zuge-
  158.      lassenen Fenster verwaltet werden, es können jedoch immer nur
  159.      maximal sieben aktiv sein. *)
  160.  
  161.   PROCEDURE clearWindow  (u: window);
  162.  
  163.   PROCEDURE closeWindow  (u: window);
  164.  
  165.   PROCEDURE deleteWindow (u: window);
  166.  
  167.   PROCEDURE fullWindow   (u: window);
  168.  
  169.   PROCEDURE openWindow   (u: window; x, y, w, h: INTEGER);
  170.  
  171.   PROCEDURE setWindow    (u: window; x, y, w, h: INTEGER);
  172.  
  173.   PROCEDURE topWindow    (u: window);
  174.  
  175.   PROCEDURE MouseOn;
  176.  
  177.   PROCEDURE MouseOff;
  178.  
  179.   (* Vor Ausgaben auf den Bildschirm muss die Maus ausgeschaltet werden,
  180.      da sonst das Maussymbol überschrieben wird und bei der nächsten
  181.      Bewegung der Maus der alte, zuvor von der Maus verdeckte Bildschirm-
  182.      inhalt wieder restauriert wird. Alle Prozeduren in diesem Modul, die
  183.      den Bildschirm verändern, schalten die Maus während der Ausgabe aus.
  184.      Während des Aufrufs der vom Benutzer bereitgestellten Redraw-Prozedur
  185.      beim Abarbeiten der Rechteckliste in "DoRedraw" wird die Maus eben-
  186.      falls ausgeschaltet, ruft der Benutzer dagegen selbst seine Redraw-
  187.      Prozedur auf oder benutzt er die weiter unten beschriebenen Textaus-
  188.      gabeprozeduren, muss er sich selbst um die Maus kümmern.
  189.  
  190.      Achtung:  Ein- und Ausschalten der Maus wird vom Betriebssystem
  191.                mitgezählt. Wird die Maus mehrmals ausgeschaltet, muß
  192.                sie genausooft wieder eingeschaltet werden, damit sie
  193.                sichtbar wird. Wird die Maus zu oft eingeschaltet, dann
  194.                entstehen beim Bewegen von Fenstern und Schiebern Schmutz-
  195.                effekte.
  196.   *)
  197.  
  198.  
  199.   PROCEDURE SetHorSlider (u: window; wpos, wsize, total: INTEGER);
  200.  
  201.   (* siehe "SetVertSlider", setzt den h